package com.ittao.taoaicodemother.ai.tools;

import cn.hutool.json.JSONObject;
import com.ittao.taoaicodemother.manage.storage.strategy.FileStorageStrategy;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Set;

/**
 * 文件目录读取工具
 * 使用 Hutool 简化文件操作
 */
@Slf4j
@Component
public class FileDirReadTool extends BaseTool {

    /**
     * 需要忽略的文件和目录
     */
    private static final Set<String> IGNORED_NAMES = Set.of(
            "node_modules", ".git", "dist", "build", ".DS_Store",
            ".env", "target", ".mvn", ".idea", ".vscode", "coverage"
    );

    /**
     * 需要忽略的文件扩展名
     */
    private static final Set<String> IGNORED_EXTENSIONS = Set.of(
            ".log", ".tmp", ".cache", ".lock"
    );

    @Tool("读取目录结构，获取指定目录下的所有文件和子目录信息")
    public String readDir(
            @P("目录的相对路径，为空则读取整个项目结构")
            String relativeDirPath,
            @ToolMemoryId Long appId
    ) {
        String dir = relativeDirPath == null || relativeDirPath.trim().isEmpty() ? "项目根目录" : relativeDirPath;
        try {
            // 使用策略模式获取当前存储策略
            FileStorageStrategy storageStrategy = getCurrentStorageStrategy();
            
            String fullDirPath;
            if (relativeDirPath == null || relativeDirPath.trim().isEmpty()) {
                // 路径为空，读取项目根目录
                fullDirPath = buildProjectRootPath(appId);
            } else {
                // 使用基类的统一路径构建方法
                fullDirPath = buildFullFilePath(appId, relativeDirPath);
            }
            
            // 检查目录是否存在并读取内容
            try {
                // 对于本地存储，直接使用File API
                if (storageStrategy.getStorageType().name().equals("LOCAL")) {
                    File dirFile = new File(fullDirPath);
                    if (!dirFile.exists() || !dirFile.isDirectory()) {
                        return "错误：目录不存在或不是有效目录 - " + dir;
                    }
                    
                    StringBuilder result = new StringBuilder();
                    result.append("目录内容: ").append(dir).append("\n");
                    
                    File[] files = dirFile.listFiles();
                    if (files != null && files.length > 0) {
                        for (File file : files) {
                            if (!shouldIgnore(file.getName())) {
                                if (file.isDirectory()) {
                                    result.append("[目录] ").append(file.getName()).append("/\n");
                                } else {
                                    result.append("[文件] ").append(file.getName()).append("\n");
                                }
                            }
                        }
                    } else {
                        result.append("目录为空\n");
                    }
                    return result.toString();
                } else {
                    // 对于COS存储，暂时返回不支持的提示
                    return "错误：COS存储暂不支持目录列表功能";
                }
            } catch (Exception e) {
                return "错误：读取目录失败 - " + dir + ", 错误: " + e.getMessage();
            }

        } catch (Exception e) {
            String errorMessage = "读取目录失败: " + dir + ", 错误: " + e.getMessage();
            log.error(errorMessage, e);
            return errorMessage;
        }
    }
    


    /**
     * 判断是否应该忽略该文件或目录
     */
    private boolean shouldIgnore(String fileName) {
        // 检查是否在忽略名称列表中
        if (IGNORED_NAMES.contains(fileName)) {
            return true;
        }

        // 检查文件扩展名
        return IGNORED_EXTENSIONS.stream().anyMatch(fileName::endsWith);
    }

    @Override
    public String getToolName() {
        return "readDir";
    }

    @Override
    public String getDisplayName() {
        return "读取目录";
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        String relativeFilePath = arguments.getStr("relativeFilePath");
        if (relativeFilePath == null) {
            relativeFilePath = "根目录";
        }
        // 生成简洁的工具执行结果
        String result = String.format("""
                **🗂️ [工具调用]** %s %s
                """, getDisplayName(), relativeFilePath);

        // 输出前端和要持久化的内容
        return String.format("\n\n%s\n\n", result);
    }
}
